const STR = 'abcdefghijklmnopqrstuvwxyz0987654321ABCDEFGHIJKLMNOPQRSTUVWXYZ'
// 验证邮箱的正则
const emailReg = /^\w+@[a-z\d]{2,}(\.[a-z]{2,3}){1,2}$/
// 验证电话的正则
const mobileReg = /^1[3-9]\d{9}$/
// 验证用户名,汉字>=2或英文开头>=2
const usernameReg = /(^[\u4e00-\u9fa5]{2,}$)|(^[a-zA-Z]\w{1,}$)/
// 日期格式yyyy-MM-dd hh:mm:ss
const dateReg = /^\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/
// 图片的规则
const imgReg = /^img|png|jpg|gif|bmp|webp$/
// 年龄规则[1,120]
const ageReg = /(^[1-9]$)|(^[1-9]\d$)|(^1[0-1][0-9]$)|(^120$)/

// 判断是否是空字符串
let isEmptyString = (str) => {
  return str === '' || str.trim() === ''
}

// 获得args的数据类型
let getTypeOfParam = (args) => {
  // [object String]
  return Object.prototype.toString.call(args).slice(8, -1)
}

// 判断args是否是字符串
let isString = (args) => {
  return Object.prototype.toString.call(args).slice(8, -1) === 'String'
}

// 字符串反转
let reverseString = (str) => {
  if (!isString(str)) {
    return console.log('请传递字符串参数')
  }
  if (isEmptyString(str)) {
    return ''
  }
  return str.split('').reverse().join('')
}

// 获得url中的查询参数
let getQuery = (url) => {
  // 'http://146.56.230.35:3007/users/login?username=admin&mobile=13988881111&password=123456&id=1&age=20&gender=女'
  let query = {}
  if (isEmptyString(url)) {
    console.log('url不能是空字符串')
    return query
  }
  let index = url.indexOf('?')
  if (index === -1) {
    console.log('当前url中没有查询参数')
    return query
  }
  let queryString = url.substring(index + 1)
  if (isEmptyString(queryString)) {
    console.log('当前url中没有查询参数')
    return query
  }
  // ['username=admin','mobile=13988881111','password=123456','id=1','age=20','gender=女']
  let arr = queryString.split('&')
  arr.forEach((item) => {
    let list = item.split('=')
    console.log(list)
    // 属性名称
    let property = list[0]
    // 属性值
    let value = list[1]
    // 把字符串转换为数字，如果转换不成功说明value是字符串，value不是数字字符串
    let rt = Number(value)
    // 把数字字符串转换为数字
    if (!Number.isNaN(rt) && property !== 'password' && property !== 'mobile') {
      value = rt
    }
    // 把属性和属性对应的值赋值给对象query
    query[property] = value
  })
  return query
}

// 日期格式化
const formatTime = (date) => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()
  return `${[year, month, day].map(formatNumber).join('-')} ${[hour, minute, second].map(formatNumber).join(':')}`
}

// 不够2位加0
const formatNumber = (n) => {
  n = n.toString()
  return n[1] ? n : `0${n}`
}

// 到指定日期date还有多长时间
function getTime(date) {
  let dateNowTime = new Date().getTime()
  let date51Time = new Date(date).getTime()
  // let date51Time = new Date('2023-05-01 08:00:00').getTime()
  let times = date51Time - dateNowTime // 现在到5.1的毫秒数
  // 一天的毫秒数
  let dayTime = 86400 * 1000
  let days = Math.floor(times / dayTime)
  // 一个小时的毫秒数
  let hoursTime = 3600 * 1000
  let hours = Math.floor((times % dayTime) / hoursTime)
  // 一分钟的毫秒数
  let minTimes = 60 * 1000
  let mins = Math.floor((times % hoursTime) / minTimes)
  let secs = Math.floor((times % minTimes) / 1000)
  return days + '天 ' + hours + ':' + mins + ':' + secs
}

// 2022年10月14日 02:52:55 PM 星期五
function formatTime_1() {
  let date = new Date()
  let y = date.getFullYear()
  let m = date.getMonth() + 1
  let d = date.getDate()
  let h = date.getHours()
  let minu = date.getMinutes()
  let s = date.getSeconds()
  let flag = 'AM'
  if (h > 12) {
    h -= 12
    flag = 'PM'
  }
  let day = date.getDay()
  let arr = [y, m, d, h, minu, s, day].map(formatNumber)
  let str = `${arr[0]}年${arr[1]}月${arr[2]}日 ${arr[3]}:${arr[4]}:${arr[5]} ${flag} ${getDayOfWeek(day)}`
  return str
}

// 传递参数获得周中的天
function getDayOfWeek(n) {
  let week = ['星期一', '星期二', '星期三', '星期四', '星期五', '星期六', '星期日']
  return week[n - 1]
}

// 获得el元素的style样式:fontSize
function getStyle(el, style) {
  // defaultView是document显示的window
  return document.defaultView.getComputedStyle(el, null)[style]
}

// 元素的拖拽方法
function drag(el) {
  el.onmousedown = function (e) {
    // 获得鼠标坐标点，相对点击元素的边缘的距离
    let { offsetX, offsetY } = e
    // 绑定鼠标滑动事件
    el.onmousemove = function (e) {
      let container = el.offsetParent
      // 获得元素container的可见宽高
      let width = container.clientWidth
      let height = container.clientHeight
      // 获得el元素的宽高
      let w = el.offsetWidth
      let h = el.offsetHeight
      // 获得鼠标坐标点，鼠标到页面边缘的距离
      let { pageX, pageY } = e
      // 页面坐标减去元素的坐标就是元素的定位值
      let top = pageY - offsetY
      let left = pageX - offsetX
      // 判断最右边的边界
      if (left + w > width) {
        left = width - w
      }
      // 最左边的边界
      if (left < 0) {
        left = 0
      }
      // 判断最下边的边界
      if (top + h > height) {
        top = height - h
      }
      // 判断最上边的边界
      if (top < 0) {
        top = 0
      }
      // 设置元素的top left值
      el.style.top = top + 'px'
      el.style.left = left + 'px'
    }
    // 最后把元素的滑动事件和鼠标的松开事件移除
    document.onmouseup = function () {
      document.onmouseup = el.onmousemove = null
    }
  }
}

// 无限滚动轮播函数
let id = 0
function loop(el) {
  if (id) {
    clearTimeout(id)
  }
  let firstElement = el.firstElementChild
  firstElement.style.transition = 'margin-top 1s linear'
  firstElement.style.marginTop = '-30px'
  id = setTimeout(function () {
    el.appendChild(firstElement)
    firstElement.style.transition = 'unset'
    firstElement.style.marginTop = '0'
    loop(el)
  }, 1000)
}

// 6位随机验证码包含数字和字母
function getRandomCode() {
  let str = ''
  for (let i = 0; i < 6; i++) {
    str += STR[Number.parseInt(Math.random() * STR.length)]
  }
  return str
}

// 判断字符串是否包含数字
function includesDigital(str) {
  // 不是字符串或者空
  if (!isString(str) || !str) {
    return false
  }
  for (let i = 0; i < str.length; i++) {
    if (!isNaN(str[i])) {
      // 包含数字
      return true
    }
  }
  return false
}

// 去除前边空格
function removePrefixSpace(str) {
  if (!str || !isString(str)) {
    return ''
  }
  let reg = /^\s+/
  return str.replace(reg, '')
}

// 去除后面的空格
function removeSuffixSpace(str) {
  if (!str || !isString(str)) {
    return ''
  }
  let reg = /\s+$/
  return str.replace(reg, '')
}

// 清空所有的空格
function trimAll(str) {
  if (!str || !isString(str)) {
    return ''
  }
  let reg = /\s/g
  return str.replace(reg, '')
}

// 去除首尾的空格
function trims(str) {
  if (!str || !isString(str)) {
    return ''
  }
  let reg = /(^\s+)|(\s+$)/g
  return str.replace(reg, '')
}

// 字符串的全局替换函数
function replaceByReg(reg, str) {
  // let str1 = 'abc345efg' //abc[3][4][5]efg
  // let st = str1.replace(/\d/g, function (item) {
  //   return '[' + item + ']'
  // })
  // return st
  return str.replace(reg, function (item) {
    return '[' + item + ']'
  })
}

// 通过birthday获得年龄
function getAgeByBirthDay(birthday) {
  let now = new Date().getTime()
  let mow = new Date(birthday).getTime()
  return Math.floor((now - mow) / (86400 * 1000 * 365))
}

// 从sessionStorage中获得登录的用户名称
function getLoginNameFromSessionStorage() {
  let str = sessionStorage.getItem('USER_LOGIN')
  if (!str) {
    return ''
  }
  let object = JSON.parse(str)
  // 返回对象中的userName
  // 注意不同的接口可能用户名参数及路径不同
  return object?.data?.userName
}

// 获得登录用户的id方法
function getLoginIdFromSessionStorage() {
  let str = sessionStorage.getItem('USER_LOGIN')
  if (!str) {
    return ''
  }
  let object = JSON.parse(str)
  // 返回对象中的id a?意思是如果a存在就使用a,否则返回undefined,避免空指针异常
  return object?.data?.id
}

// 获得登录用户的userRole方法
function getLoginUserRole() {
  let str = sessionStorage.getItem('USER_LOGIN')
  if (!str) {
    return ''
  }
  let object = JSON.parse(str)
  // 返回对象中的id a?意思是如果a存在就使用a,否则返回undefined,避免空指针异常
  return object?.data?.userRole
}

// 获得sessionStorage中的token参数
function getToken() {
  let str = sessionStorage.getItem('USER_LOGIN')
  if (!str) {
    return ''
  }
  let obj = JSON.parse(str)
  return obj.token
}
